[项目问题]使用Redis缓存

SpringSecurity对登陆用户进行权限划分

  • Security启动.userDetailsService(service)来使用数据库。
  • 根据用户名从数据库中获取密码(使用Mybatis)
  • 密码正确就返回一个UserDeatil,里面包含用户名、密码、角色。
  • 在登陆验证过程中,通过Handler实现自定义的跳转。只有对应权限的用户才能访问对应的界面。

Redis实现记住我功能

  • SpringSecurity开启remenberMe(),
  • 设置一个Token的有效期
  • 写一个自定义的tokeRepository实现redis持久化token。

  • 实现了PersistenTokenReposity的类

    • createNewToken:创建新的token,
      • 如果勾选了记住我选项,则会生成一个系的Token,并将Token持久化到Redis中。
      • 首先清除用户之前的token信息。
      • 存入,(key, token, 有效期)
    • updateToken:每次新的会话都会更新Token。
      • 当用户再次访问时,更新Token的最后使用时间和值。
    • getTokeForSeries:通过Series获取Token对象。
      • 当用户再次访问时,如果存在Token,则会从Redis中检索Token对像。
    • removeToken:更新Token
      • 当用户注销或Token过期时,调用该方法删除指定用户的所有Token。

邮件发送

SpringBoot已经给我们提供了封装好的邮件模块使用。注入依赖即可。

  • 在.yml文件配置:

    1
    2
    3
    4
    5
    6
    7
    8
    spring:
    mail:
    # 163邮箱的地址为smtp.163.com,直接填写即可
    host: smtp.163.com
    # 你申请的163邮箱
    username: 1070362388@163.com
    # 注意密码是在开启smtp/pop3时自动生成的,记得保存一下,不然就找不到了
    password: WCKBLIQKEDBTHHYM
  • 用户在注册过程中点击获取验证码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    @Service
    public class VerifyServiceImpl implements VerifyService {

    //JavaMailSender是专门用于发送邮件的对象,自动配置类已经提供了Bean
    @Resource
    JavaMailSender sender;
    //Redis的模版类
    @Resource
    StringRedisTemplate template;
    @Value("${spring.mail.username}")
    String from;

    @Override
    public void sendVerifyCode(String mail) {
    //SimpleMailMessage是一个比较简易的邮件封装,支持设置一些比较简单内容
    SimpleMailMessage message = new SimpleMailMessage();
    message.setSubject("【测试】你的网站注册验证码");
    //生成随机验证码
    Random random = new Random();
    int code = random.nextInt(899999) + 100000;
    //设置键值存入,并设定存在时间为3分钟
    template.opsForValue().set("verity:code" + mail, code+"", 3, TimeUnit.MINUTES);
    //邮件内容格式
    message.setText("您的验证码为:" + code + ",三分钟内有效,请及时完成注册!");
    //设置邮件发送给谁,可以多个,这里就发给你的QQ邮箱
    message.setTo(mail);
    //邮件发送者,这里要与配置文件中的保持一致
    message.setFrom(from);
    //OK,万事俱备只欠发送
    sender.send(message);
    }

    @Override
    public boolean doVerify(String mail, String code) {
    //从Redis中取值
    String verify = template.opsForValue().get("verity:code" + mail);
    //如果不存在或者错误返回错误
    if(verify == null) return false;
    if(!verify.equals(code)) return false;
    //正确返回并删除此认证码
    template.delete("verity:code" + mail);
    return true;
    }
    }

Mybatis完成分页查询

  • 接收前端发送的一个list,里面包含用户名,电话号码,当前页数,页面大小等参数
  • 如果用户名,电话号码为空,则查询全部,否则按条件查询。
    1
    @Select("select * from student where name = #{name} limit #{pageNo}, #{pageSize}" )